﻿using System;
using MathService.DSP.Signals;
namespace MathService.DSP
{
    /// <summary>Интерфейс цифрового фильтра</summary>
    public interface IDigitalFilter : IInitializable
    {
        /// <summary>Получить импульсную характеристику</summary>
        /// <param name="dt">Период дискретизации в секундах</param>
        /// <param name="Length">Длина выборки в секундах</param>
        /// <returns>Цифровой сигнал - импульсная характеристика</returns>
        DigitalSignal GetImpulseResponse(double dt, double Length);

        /// <summary>Инициализировать фильтр</summary>
        new void Initialize();

        /// <summary>Порядок фильтра</summary>
        int Order { get; }

        /// <summary>Обработать отсчёт</summary>
        /// <param name="x_n">Обрабатываемый отсчёт</param>
        /// <returns>Результат прохождения отсчёта через фильтр</returns>
        double Process(double x_n);

        /// <summary>Обработать цифровой сигнал</summary>
        /// <param name="s">Входное воздействие</param>
        /// <returns>Выходной сигнал</returns>
        DigitalSignal ProcessSignal(DigitalSignal s);

        /// <summary>Обработать выборку отсчётов</summary>
        /// <param name="x">Входное воздействие в виде выборки отсчётов</param>
        /// <returns>Результирующая выборка отсчётов</returns>
        double[] ProcessSignal(double[] x);
    }
}
